package com.study.annotation.demo;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @Name: MyAnnotation
* @Description: 自定义注解测试
* 说明：
* 	1、元注解：用来注解其他注解，即注解的注解。
	 	Java定义了4个标准的meta-annotation类型，它们被用来提供对其他annotation类型进行说明
	 	@Target元注解：注解的作用目标。
	 		源码：
	 			@Documented
				@Retention(RetentionPolicy.RUNTIME)
				@Target(ElementType.ANNOTATION_TYPE)
				public @interface Target {
		    		ElementType[] value();  //value={ElementType.PACKAGE, ElementType.METHOD, ElementType.FIELD ... }
				}
			注解参数值：
				ElementType类型：是一个enum枚举类型，定义了注解使用范围的几个常量
					PACKAGE	用在包上
					METHOD	用在方法上
					CONSTRUCTOR	用在构造方法上
					FIELD	用在字段、枚举的常量上
					PARAMETER	用在方法的参数上
					LOCAL_VARIABLE	用在局部变量上
					ANNOTATION_TYPE	用在注解上
					TYPE	用在接口、类、枚举、注解等
			用法：
				@Target(value={ElementType.METHOD, ElementType.TYPE})
		@Retention元注解：注解的保留位置。
			源码：
				@Documented
				@Retention(RetentionPolicy.RUNTIME)
				@Target(ElementType.ANNOTATION_TYPE)
				public @interface Retention {
				    RetentionPolicy value();
				}
			注解参数值：
				RetentionPolicy类：是一个num枚举类型，定义了注解生命周期的三个常量
					SOURCE	注解仅存在于源码中，在class字节码文件中不包含
					CLASS	默认的保留策略，注解会在class字节码文件中存在，但运行时无法获得
					RUNTIME	注解会在class字节码文件中存在，在运行时可以通过反射获取到该注解
			用法：
				@Retention(RetentionPolicy.RUNTIME)
		@Documented元注解：说明该注解将被包含在javadoc中
		@Inherited元注解：说明子类可以继承父类中的该注解
	2、注解的定义：
		1、声明注解
			@interface说明：
				作用：用来声明一个注解
				格式：public @interface 注解名 {定义体，即注解参数、注解元素}
		2、定义注解参数
			格式：注解参数类型	注解参数名称()	default	注解参数默认值
			说明：如果只定义了一个注解参数，参数名称一般为定义为value()
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-19 上午9:48:08 
* @Version: V1.0
 */
@Documented
@Inherited
@Target(value={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation02 {
	//String value() ; 在只定义一个注解参数的情况下，参数名称一般为定义为value()
	String name() default "" ;
	int age() default 0 ;
	int sex() default -1 ; //默认值-1表示：如果注解时，没有传递该注解参数，默认不存在该注解参数，类似String.indexOf("abc")，如果找不到"abc"，则返回-1，表示不存在该字符串
	String[] city() default {"北京", "上海", "深圳"} ;
}








